home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat31 / iobject / sources.lha / sources / Scroller.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-23  |  4.9 KB  |  240 lines

  1. // Gestionnaire de Scroller V0.34
  2. // (C) 1992 Christophe PASSUELLO
  3. // Thu Jan 28 15:06:39 1993
  4.  
  5.  
  6. #include <exec/types.h>
  7. #include <exec/memory.h>
  8. #include <mytypes.h>
  9. #define  INTUITION_PREFERENCES_H 0
  10. #include <intuition/intuition.h>
  11. #include "IObject_priv.h"
  12.  
  13.  
  14. // Prototypes des methodes virtuelles
  15. PRIVATE BOOL ScrollerMsg(struct Scroller *, struct IntuiMessage *);
  16. PRIVATE VOID EraseScroller(struct Scroller *);
  17. PRIVATE VOID DisplayScroller(struct Scroller *);
  18. PRIVATE VOID ModifyScroller(struct Scroller *, ULONG, ULONG, ULONG);
  19. PRIVATE UWORD ScrollerValue(struct Scroller *);
  20. PRIVATE VOID OnScroller(struct Scroller *);
  21.  
  22. struct Scroller
  23. {
  24.     struct ObjectTMV *TMV;
  25.     UWORD  ObjectID;
  26.     UWORD  Flags;
  27.     STRPTR LabelText;
  28.     struct TextFont *Font;
  29.     struct Window *window;
  30.     struct Requester *requester;
  31.     UWORD  ClassFlags;
  32.     struct Box BorderBox;
  33.     struct Gadget Gadget;
  34.  
  35.     struct PropInfo PropInfo;
  36.     struct Image Image;
  37.     UWORD  CurPos;
  38.     UWORD  KnobSize;
  39.     UWORD  MaxSize;
  40. };
  41.  
  42.  
  43. // Table des methodes virtuelles
  44. const static struct ObjectTMV ScrollerMethod=
  45. {
  46.     CLASS_SCROLLER, sizeof(struct Scroller),
  47.     DisposeObject,ScrollerMsg,AddObject,RemoveObject,DisplayScroller,EraseScroller,
  48.     ModifyScroller, ScrollerValue, OffObjectGad, OnScroller, DoNothing
  49. };
  50.  
  51.  
  52. //
  53. // Alloue et initialise un Scroller
  54. //
  55. struct Scroller *CreateScroller(struct NewScroller *ns, UWORD ID)
  56. {
  57.     struct Scroller *sc;
  58.  
  59.     if (sc = (struct Scroller *) AllocMem( sizeof(struct Scroller), MEMF_PUBLIC|MEMF_CLEAR))
  60.     {
  61.         sc->TMV = &ScrollerMethod;
  62.         sc->ObjectID = ID;
  63.         sc->CurPos = ns->Pos;
  64.         sc->KnobSize = ns->CurSize;
  65.         sc->MaxSize = ns->MaxSize;
  66.  
  67.         // recupere les champs de NewScroller
  68.         InitObjectGad((struct ObjectGad *) sc, (struct NewObject *) ns);
  69.         AdjustBox( (struct Box *) &sc->Gadget.LeftEdge, FALSE);
  70.  
  71.         // initialise le gadget
  72.         sc->Gadget.Flags = GADGHCOMP;
  73.         sc->Gadget.Activation = GADGIMMEDIATE|RELVERIFY|FOLLOWMOUSE;
  74.  
  75.         if (sc->ClassFlags & SC_NOMOUSE)
  76.             sc->Gadget.Activation &= (~FOLLOWMOUSE);
  77.  
  78.         sc->Gadget.GadgetType = PROPGADGET;
  79.  
  80.         sc->Gadget.GadgetRender = &sc->Image;
  81.         sc->Gadget.SpecialInfo = &sc->PropInfo;
  82.  
  83.         // Initialise le PropInfo
  84.         sc->PropInfo.Flags = AUTOKNOB|PROPBORDERLESS;
  85.         if (ns->NewObj.ClassFlags & SC_VERTICAL)
  86.         {
  87.             sc->PropInfo.Flags |= FREEVERT;
  88.             sc->PropInfo.VertBody = MAXBODY;
  89.         }
  90.         else
  91.         {
  92.             sc->PropInfo.Flags |= FREEHORIZ;
  93.             sc->PropInfo.HorizBody = MAXBODY;
  94.         }
  95.     }
  96.     return (sc);
  97. }
  98.  
  99.  
  100. //
  101. // Renvoie la position du curseur
  102. //
  103. PRIVATE UWORD ScrollerValue(struct Scroller *sc)
  104. {
  105.     return(sc->CurPos);
  106. }
  107.  
  108.  
  109. //
  110. // Change les valeurs du Scroller
  111. //
  112. PRIVATE VOID ModifyScroller(struct Scroller *sc, ULONG Pos, ULONG Size, ULONG Max)
  113. {
  114.     ULONG body, pot;
  115.  
  116.     // Correction des entrees
  117.     Size = MIN(Size, Max);
  118.     Pos = MIN(Pos, Max - Size);
  119.  
  120.     // calcule le Body et le Pot
  121.     if (Size == Max)
  122.     {
  123.         body = MAXBODY;
  124.         pot = 0;
  125.     }
  126.     else
  127.     {
  128.         body = (MAXBODY * Size) /Max;
  129.         pot = (MAXPOT * Pos) / (Max - Size);
  130.     }
  131.  
  132.     // met a jour le Scroller
  133.     sc->KnobSize = Size;
  134.     sc->MaxSize = Max;
  135.     sc->CurPos = Pos;
  136.  
  137.     if (sc->ClassFlags & SC_VERTICAL)
  138.     {
  139.         sc->PropInfo.VertPot = pot;
  140.         sc->PropInfo.VertBody = body;
  141.     }
  142.     else
  143.     {
  144.         sc->PropInfo.HorizPot = pot;
  145.         sc->PropInfo.HorizBody = body;
  146.     }
  147.  
  148.     // rafraichie le scroller
  149.     if (!(sc->Flags & OBJ_DISABLED))
  150.         NewModifyProp(&sc->Gadget, sc->window, sc->requester, sc->PropInfo.Flags,
  151.                                   pot , pot, body, body, 1L);
  152. }
  153.  
  154.  
  155. //
  156. // gestion de l'IntuiMessage pour le scroller
  157. //
  158. PRIVATE BOOL ScrollerMsg(struct Scroller *sc, struct IntuiMessage *msg)
  159. {
  160.     ULONG pos;
  161.     BOOL changed;
  162.  
  163.     switch (msg->Class)
  164.     {
  165.         case GADGETUP:
  166.             SetActiveObject(NULL, 0L);
  167.         case MOUSEMOVE:
  168.             UWORD diff;
  169.  
  170.             diff = sc->MaxSize - sc->KnobSize;
  171.             if (sc->ClassFlags & SC_VERTICAL)
  172.                 pos = (sc->PropInfo.VertPot * diff) / MAXPOT;
  173.             else
  174.                 pos = (sc->PropInfo.HorizPot * diff) / MAXPOT;
  175.             if (sc->CurPos == pos)
  176.                 changed = FALSE;
  177.             else
  178.             {
  179.                 sc->CurPos = pos;
  180.                 changed = TRUE;
  181.             }
  182.             break;
  183.         case GADGETDOWN:
  184.             SetActiveObject((struct Object *) sc, GADGETUP|GADGETDOWN|MOUSEMOVE);
  185.             changed = FALSE;
  186.             break;
  187.     }
  188.     return (changed);
  189. }
  190.  
  191.  
  192. //
  193. // Efface le Scroller
  194. //
  195. PRIVATE VOID EraseScroller(struct Scroller *sc)
  196. {
  197.     EraseObjectFrame( (struct Object *) sc , &sc->BorderBox);
  198. }
  199.  
  200.  
  201. //
  202. // Affiche le Scroller
  203. //
  204. PRIVATE VOID DisplayScroller(struct Scroller *sc)
  205. {
  206.     struct RastPort *rp;
  207.     struct TextEnv env;
  208.  
  209.     if (sc->window)
  210.     {
  211.         rp = sc->window->RPort;
  212.  
  213.         ModifyScroller(sc, sc->CurPos, sc->KnobSize, sc->MaxSize);
  214.  
  215.         SaveTextEnv(sc->window->RPort, &env);
  216.         FastDraw3DBox( (struct Box *) &sc->BorderBox, rp, BOX_1OUT);
  217.         PrintObjectLabel( (struct Object *) sc, (struct Box *) &sc->BorderBox);
  218.         RestoreTextEnv(rp, &env);
  219.  
  220.         if (sc->Flags & OBJ_DISABLED)
  221.             OffObjectGad( (struct ObjectGad *) sc);
  222.     }
  223. }
  224.  
  225.  
  226. //
  227. // Unghoste le scroller
  228. //
  229. PRIVATE VOID OnScroller(struct Scroller *sc)
  230. {
  231.     if (sc->Flags & OBJ_DISABLED)
  232.     {
  233.         EraseBox( (struct Box *) &sc->Gadget.LeftEdge, sc->window->RPort);
  234.         OnGadget(&sc->Gadget, sc->window, sc->requester);
  235.         sc->Flags &= (~OBJ_DISABLED);
  236.  
  237.         ModifyScroller(sc, sc->CurPos, sc->KnobSize, sc->MaxSize);
  238.     }
  239. }
  240.